package com.speily;


import org.junit.Test;

/**
 * @Auther: SPL
 * @Date: 2019-08-22 18:54
 * @Description: - 排序
 */
public class OrderTest {

    /**
     * 1、冒泡排序<br>
     * <p>
     * 双重For循环、值交换<br>
     * 外层的循环次数比内层多一次，+ 1；
     * 假设外层nums[i]没有内层nums[i]，则双方互换值（位置），需要中间变量max中转
     */
    @Test
    public void test01() {

        Integer[] numList = {1, 2, 2, 2, 1, 4, 5, 2, 5, 3, 9, 6};

        for (int i = 1; i < numList.length; i++) {
            for (int j = i + 1; j < numList.length; j++) {
                if (numList[i] > numList[j]) {
                    int max = numList[j];
                    numList[j] = numList[i];
                    numList[i] = max;
                }
            }
        }
        //打印结果
        for (int x : numList) {
            System.out.println(x);
        }
    }

    /**
     * 1、选择排序<br>
     * <p>
     * 双重For循环、找下标交换值<br>
     * 外层
     * 假设外层nums[i]没有内层nums[i]，则双方互换值（位置），需要中间变量max中转
     */
    @Test
    public void test021() {

        Integer[] numList = {1, 2, 4, 5, 2};

        this.sort(numList, 0);

        //打印结果
        for (int x : numList) {
            System.out.println(x);
        }
    }

    /**
     * 选择排序，递归模式
     *
     * @param numList
     * @param index 下标，初始0（以刻度理解）
     */
    public void sort(Integer[] numList, int index) {

        int min = index;

        //选出之后待排序中值最小的位置
        for (int i = index; i < numList.length; i++) {
            if (numList[i] < numList[min]) {
                min = i;//最小值的下标
            }
        }

        //下标 - 值交换
        if (min != index) {
            int temp = numList[index];
            numList[index] = numList[min];
            numList[min] = temp;
        }

        //递归
        index += 1;
        if (index < numList.length) {
            sort(numList, index);
        }
    }

}
